package mx.ipn.persistencia.mysql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import mx.ipn.persistencia.FabricaDeDAOs;
import mx.ipn.persistencia.dao.BitacoraServicioTarjetaDAO;
import mx.ipn.persistencia.dao.BitacoraServicioDAO;
import mx.ipn.persistencia.dao.TarjetaClienteDAO;
import mx.ipn.to.BitacoraServicioTarjetaTO;
import mx.ipn.to.BitacoraServicioTO;
import mx.ipn.to.TarjetaClienteTO;

public class BitacoraServicioTarjetaDAOMySQL implements
		BitacoraServicioTarjetaDAO {
	static{FabricaDeDAOsMySQL.iniciaLog(BitacoraServicioTarjetaDAOMySQL.class);}

	private static final String INSERT = "INSERT INTO bitacora_servicio_tarjeta(id_bitacora_servicio,id_tarjeta_cliente) VALUES(?,?)";
	private static final String FINDBYID = "SELECT * FROM bitacora_servicio_tarjeta WHERE id_operacion=?";
	
	private static final String SELECT = "SELECT * FROM bitacora_servicio_tarjeta";
	
	private static final String SELECTBYBITACORASERVICIO = "SELECT * FROM bitacora_servicio_tarjeta WHERE id_bitacora_servicio=?";
	private static final String SELECTBYTARJETACLIENTE = "SELECT * FROM bitacora_servicio_tarjeta WHERE id_tarjeta_cliente=?";

	@Override
	public BitacoraServicioTarjetaTO findBitacoraServicioTarjetaById(
			int idOperacion) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(FINDBYID);
			ps.setInt(1, idOperacion);
			ResultSet rs = ps.executeQuery();

			ArrayList<BitacoraServicioTO> listBitacoraServicioTO = null;
			ArrayList<TarjetaClienteTO> listTarjetaClienteTO = null;

			if (rs.next()) {
				FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
						.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

				BitacoraServicioDAO bitacoraServicioDAO = fabricaMySQL
						.getBitacoraServicioDAO();
				TarjetaClienteDAO tarjetaClienteDAO = fabricaMySQL
						.getTarjetaClienteDAO();

				listBitacoraServicioTO = new ArrayList<BitacoraServicioTO>();
				listTarjetaClienteTO = new ArrayList<TarjetaClienteTO>();

				int idBitacoraServicio = rs.getInt("id_bitacora_servicio");
				int idTarjetaCliente = rs.getInt("id_tarjeta_cliente");

				listBitacoraServicioTO.add(bitacoraServicioDAO
						.findBitacoraServicioById(idBitacoraServicio));
				listTarjetaClienteTO.add(tarjetaClienteDAO
						.findTarjetaClienteById(idTarjetaCliente));

				BitacoraServicioTO[] arrBitacoraServicioTO = (BitacoraServicioTO[]) listBitacoraServicioTO
						.toArray(new BitacoraServicioTO[listBitacoraServicioTO
								.size()]);
				TarjetaClienteTO[] arrTarjetaClienteTO = (TarjetaClienteTO[]) listTarjetaClienteTO
						.toArray(new TarjetaClienteTO[listTarjetaClienteTO
								.size()]);

				BitacoraServicioTarjetaTO bitacoraServicioTarjetaTO = new BitacoraServicioTarjetaTO(
						idOperacion, arrBitacoraServicioTO, arrTarjetaClienteTO);

				ps.close();
				conexion.close();
				return bitacoraServicioTarjetaTO;
			}

			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public boolean insertBitacoraServicioTarjeta(
			BitacoraServicioTarjetaTO bitacoraServicioTarjetaTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(INSERT);
			ps.setInt(1, bitacoraServicioTarjetaTO.getIdBitacoraServicio());
			ps.setInt(2, bitacoraServicioTarjetaTO.getIdTarjetaCliente());
			ps.executeUpdate();

			ps.close();
			conexion.close();

			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	@Override
	public ArrayList<BitacoraServicioTarjetaTO> selectBitacoraServicioTarjeta() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			FabricaDeDAOs fabricaMySQL = null;

			ArrayList<BitacoraServicioTO> listBitacoraServicioTO = null;
			ArrayList<TarjetaClienteTO> listTarjetaClienteTO = null;

			ArrayList<BitacoraServicioTarjetaTO> bitacoraServicioTarjetaTO = null;
			BitacoraServicioTarjetaTO bitacoraServicioTarjetaTO2 = null;

			BitacoraServicioDAO bitacoraServicioDAO = null;
			TarjetaClienteDAO tarjetaClienteDAO = null;

			PreparedStatement ps = conexion.prepareStatement(SELECT);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (bitacoraServicioTarjetaTO == null) {
					bitacoraServicioTarjetaTO = new ArrayList<BitacoraServicioTarjetaTO>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					bitacoraServicioDAO = fabricaMySQL.getBitacoraServicioDAO();
					tarjetaClienteDAO = fabricaMySQL.getTarjetaClienteDAO();
				}

				listBitacoraServicioTO = new ArrayList<BitacoraServicioTO>();
				listTarjetaClienteTO = new ArrayList<TarjetaClienteTO>();

				int idOperacion = rs.getInt("id_operacion");
				int idBitacoraServicio = rs.getInt("id_bitacora_servicio");
				int idTarjetaCliente = rs.getInt("id_tarjeta_cliente");

				listBitacoraServicioTO.add(bitacoraServicioDAO
						.findBitacoraServicioById(idBitacoraServicio));
				listTarjetaClienteTO.add(tarjetaClienteDAO
						.findTarjetaClienteById(idTarjetaCliente));

				BitacoraServicioTO[] arrBitacoraServicioTO = (BitacoraServicioTO[]) listBitacoraServicioTO
						.toArray(new BitacoraServicioTO[listBitacoraServicioTO
								.size()]);
				TarjetaClienteTO[] arrTarjetaClienteTO = (TarjetaClienteTO[]) listTarjetaClienteTO
						.toArray(new TarjetaClienteTO[listTarjetaClienteTO
								.size()]);

				bitacoraServicioTarjetaTO2 = new BitacoraServicioTarjetaTO(
						idOperacion, arrBitacoraServicioTO, arrTarjetaClienteTO);

				bitacoraServicioTarjetaTO.add(bitacoraServicioTarjetaTO2);
			}
			ps.close();
			conexion.close();
			return bitacoraServicioTarjetaTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public BitacoraServicioTarjetaTO selectByBitacoraServicio(
			int idBitacoraServicio) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			FabricaDeDAOs fabricaMySQL = null;

			BitacoraServicioDAO bitacoraServicioDAO = null;
			TarjetaClienteDAO tarjetaClienteDAO = null;

			ArrayList<Integer> listIdOperacion = null;
			ArrayList<BitacoraServicioTO> listBitacoraServicioTO = null;
			ArrayList<TarjetaClienteTO> listTarjetaClienteTO = null;

			BitacoraServicioTarjetaTO bitacoraServicioTarjetaTO = null;

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYBITACORASERVICIO);
			ps.setInt(1, idBitacoraServicio);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdOperacion == null) {

					listIdOperacion = new ArrayList<Integer>();
					listBitacoraServicioTO = new ArrayList<BitacoraServicioTO>();
					listTarjetaClienteTO = new ArrayList<TarjetaClienteTO>();

					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					bitacoraServicioDAO = fabricaMySQL.getBitacoraServicioDAO();
					tarjetaClienteDAO = fabricaMySQL.getTarjetaClienteDAO();
				}

				listIdOperacion.add(rs.getInt("id_operacion"));
				int idTarjetaCliente = rs.getInt("id_tarjeta_cliente");

				listTarjetaClienteTO.add(tarjetaClienteDAO
						.findTarjetaClienteById(idTarjetaCliente));

			}
			if (listIdOperacion != null) {

				listBitacoraServicioTO.add(bitacoraServicioDAO
						.findBitacoraServicioById(idBitacoraServicio));

				Integer[] arrIdOperacion = (Integer[]) listIdOperacion
						.toArray(new Integer[listIdOperacion.size()]);
				BitacoraServicioTO[] arrBitacoraServicioTO = (BitacoraServicioTO[]) listBitacoraServicioTO
						.toArray(new BitacoraServicioTO[listBitacoraServicioTO
								.size()]);
				TarjetaClienteTO[] arrTarjetaClienteTO = (TarjetaClienteTO[]) listTarjetaClienteTO
						.toArray(new TarjetaClienteTO[listTarjetaClienteTO
								.size()]);

				bitacoraServicioTarjetaTO = new BitacoraServicioTarjetaTO(
						arrIdOperacion, arrBitacoraServicioTO,
						arrTarjetaClienteTO);
			}
			ps.close();
			conexion.close();
			return bitacoraServicioTarjetaTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public BitacoraServicioTarjetaTO selectByTarjetaCliente(int idTarjetaCliente) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			FabricaDeDAOs fabricaMySQL = null;

			BitacoraServicioDAO bitacoraServicioDAO = null;
			TarjetaClienteDAO tarjetaClienteDAO = null;

			ArrayList<Integer> listIdOperacion = null;
			ArrayList<BitacoraServicioTO> listBitacoraServicioTO = null;
			ArrayList<TarjetaClienteTO> listTarjetaClienteTO = null;

			BitacoraServicioTarjetaTO bitacoraServicioTarjetaTO = null;

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYTARJETACLIENTE);
			ps.setInt(1, idTarjetaCliente);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdOperacion == null) {

					listIdOperacion = new ArrayList<Integer>();
					listBitacoraServicioTO = new ArrayList<BitacoraServicioTO>();
					listTarjetaClienteTO = new ArrayList<TarjetaClienteTO>();

					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					bitacoraServicioDAO = fabricaMySQL.getBitacoraServicioDAO();
					tarjetaClienteDAO = fabricaMySQL.getTarjetaClienteDAO();
				}

				listIdOperacion.add(rs.getInt("id_operacion"));
				int idBitacoraServicio = rs.getInt("id_bitacora_servicio");

				listBitacoraServicioTO.add(bitacoraServicioDAO
						.findBitacoraServicioById(idBitacoraServicio));

			}
			if (listIdOperacion != null) {
				listTarjetaClienteTO.add(tarjetaClienteDAO
						.findTarjetaClienteById(idTarjetaCliente));
				
				Integer[] arrIdOperacion = (Integer[]) listIdOperacion
						.toArray(new Integer[listIdOperacion.size()]);
				BitacoraServicioTO[] arrBitacoraServicioTO = (BitacoraServicioTO[]) listBitacoraServicioTO
						.toArray(new BitacoraServicioTO[listBitacoraServicioTO
								.size()]);
				TarjetaClienteTO[] arrTarjetaClienteTO = (TarjetaClienteTO[]) listTarjetaClienteTO
						.toArray(new TarjetaClienteTO[listTarjetaClienteTO
								.size()]);

				bitacoraServicioTarjetaTO = new BitacoraServicioTarjetaTO(
						arrIdOperacion, arrBitacoraServicioTO,
						arrTarjetaClienteTO);
			}
			ps.close();
			conexion.close();
			return bitacoraServicioTarjetaTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

}
